{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "XT2oM6FHVJCf"
      },
      "source": [
        "## Enviroment:\n",
        "\n",
        "Open AI gym [CartPole v0](https://github.com/openai/gym/wiki/CartPole-v0)\n",
        "\n",
        "### Observation\n",
        "\n",
        "Type: Box(4)\n",
        "\n",
        "| Num  | Observation          | Min      | Max     |\n",
        "| :--- | :------------------- | :------- | :------ |\n",
        "| 0    | Cart Position        | -2.4     | 2.4     |\n",
        "| 1    | Cart Velocity        | -Inf     | Inf     |\n",
        "| 2    | Pole Angle           | ~ -41.8° | ~ 41.8° |\n",
        "| 3    | Pole Velocity At Tip | -Inf     | Inf     |\n",
        "\n",
        "### Actions\n",
        "\n",
        "Type: Discrete(2)\n",
        "\n",
        "| Num  | Action                 |\n",
        "| :--- | :--------------------- |\n",
        "| 0    | Push cart to the left  |\n",
        "| 1    | Push cart to the right |\n",
        "\n",
        "Note: The amount the velocity is reduced or increased is not fixed as it depends on the angle the pole is pointing. This is because the center of gravity of the pole increases the amount of energy needed to move the cart underneath it\n",
        "\n",
        "### Reward\n",
        "\n",
        "Reward is 1 for every step taken, including the termination step\n",
        "\n",
        "### Starting State\n",
        "\n",
        "All observations are assigned a uniform random value between ±0.05\n",
        "\n",
        "### Episode Termination\n",
        "\n",
        "1. Pole Angle is more than ±12°\n",
        "2. Cart Position is more than ±2.4 (center of the cart reaches the edge of the display)\n",
        "3. Episode length is greater than 200\n",
        "\n",
        "### Solved Requirements\n",
        "\n",
        "Considered solved when the average reward is greater than or equal to 195.0 over 100 consecutive trials"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "xzVWtGxJVJCh"
      },
      "source": [
        "## 1. gym enviroment setup"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "G312rzBjVJCi",
        "outputId": "9c0800f5-e635-48d9-9f5c-4e099cd0d553",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "import gym\n",
        "import numpy as np\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "env = gym.make(\"CartPole-v0\")\n",
        "env.reset()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([-0.0469722 , -0.01059926, -0.04693691,  0.00855063])"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 1
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "80YCNcHUZYtI",
        "colab": {}
      },
      "source": [
        "import tensorflow as tf\n",
        "from tensorflow import keras\n",
        "from tensorflow.keras import layers\n",
        "from tqdm import tqdm\n",
        "\n",
        "tf.keras.backend.set_floatx('float64')"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "58J8FZRks6UX",
        "colab_type": "code",
        "outputId": "8f52e899-e85d-49a2-dab8-aa36d4e76323",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "# Make sure it is TF2.x\n",
        "print(tf.__version__)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "2.2.0-rc3\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "IjkusASudj9W",
        "colab": {}
      },
      "source": [
        "ACTION_SPACE_SIZE = env.action_space.n\n",
        "OBSERVATION_SPACE_SIZE = env.observation_space.shape[0]\n",
        "\n",
        "# reward discount\n",
        "GAMMA = 0.95\n",
        "EPISODES =30000\n",
        "\n",
        "ep_rewards = []\n",
        "\n",
        "AGGREGATE_STATS_EVERY = 100"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3R1OTnHJvTgK",
        "colab_type": "text"
      },
      "source": [
        "### Network"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "MJcKNwUPvYxI",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "class Network(keras.Model):\n",
        "  def __init__(self):\n",
        "    super().__init__()\n",
        "\n",
        "    self.model = keras.Sequential(\n",
        "        [layers.Dense(10, 'relu'),\n",
        "        # layers.Dense(5,'relu'),\n",
        "        layers.Dense(ACTION_SPACE_SIZE)]\n",
        "    )\n",
        "\n",
        "  def call(self, x):\n",
        "    out = self.model(x)\n",
        "\n",
        "    return out"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "lTRr9PZPZ1-1"
      },
      "source": [
        "## 3. Agent Class"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "w_7sLLVzZ1Tj",
        "colab": {}
      },
      "source": [
        "class PGAgent:\n",
        "\n",
        "  def __init__(self):\n",
        "    self.network = Network()\n",
        "    self.network.build(input_shape = (None,OBSERVATION_SPACE_SIZE))\n",
        "\n",
        "  def choose_action(self, states):\n",
        "    states = states.reshape(-1, OBSERVATION_SPACE_SIZE)\n",
        "\n",
        "    action_logits = self.network(states)\n",
        "    actions_prob = tf.nn.softmax(action_logits)\n",
        "    action = np.random.choice(len(actions_prob.numpy()[0]),p=actions_prob.numpy()[0])\n",
        "    return action\n",
        "  def train(self, states, actions, rewards):\n",
        "    \n",
        "    discounted_episode_rewards = self.discount_rewards(rewards)\n",
        "\n",
        "    # print(\"s:{}, a:{}, r:{}\".format(self.states , self.actions, self.discounted_episode_rewards))\n",
        "\n",
        "    optimizer = keras.optimizers.Adam(0.001)\n",
        "    \n",
        "    with tf.GradientTape() as tape:\n",
        "      action_logits = self.network(states)\n",
        "      cross_entropy = tf.losses.sparse_categorical_crossentropy(y_true=actions, \n",
        "                                                                   y_pred=action_logits,\n",
        "                                                                   from_logits=True )\n",
        "      loss = tf.reduce_mean(cross_entropy * discounted_episode_rewards)\n",
        "\n",
        "    grads = tape.gradient(loss, self.network.variables)\n",
        "    optimizer.apply_gradients(zip(grads, self.network.variables))\n",
        "\n",
        "\n",
        "  def discount_rewards(self,rewards):\n",
        "        # discount episode rewards\n",
        "        discounted_ep_rs = np.zeros_like(rewards)\n",
        "        running_add = 0\n",
        "        for t in reversed(range(0, len(rewards))):\n",
        "            running_add = running_add * GAMMA + rewards[t]\n",
        "            discounted_ep_rs[t] = running_add\n",
        "\n",
        "        # normalize episode rewards\n",
        "        discounted_ep_rs -= np.mean(discounted_ep_rs)\n",
        "        discounted_ep_rs /= np.std(discounted_ep_rs)\n",
        "        return discounted_ep_rs\n",
        "  "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "TUDDhaxOadLa",
        "colab": {}
      },
      "source": [
        "agent = PGAgent()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "Bpa2BCspawS3"
      },
      "source": [
        "## 4. Train the agent"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jpax4BfxQn94",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# from visdom import Visdom\n",
        "\n",
        "# vis = Visdom()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "I7j_aM56tO2_",
        "colab": {}
      },
      "source": [
        "aggr_ep_rewards = {'ep':[],'avg':[],'min':[],'max':[]}"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "Xmoxp-PEjN3s",
        "outputId": "85870b75-4369-4d01-e7cc-370bcc8f7664",
        "tags": [
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend",
          "outputPrepend"
        ],
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "# Iterate over episodes\n",
        "for episode in tqdm(range(1, EPISODES + 1), ascii=True, unit='episodes'):\n",
        "    # Restarting episode - reset episode states,actions, and rewards \n",
        "    episode_states, episode_actions, episode_rewards = [],[],[]\n",
        "    \n",
        "    #Reset single step reward\n",
        "    episode_reward = 0\n",
        "\n",
        "    # Reset environment and get initial state\n",
        "    current_state = env.reset()\n",
        "\n",
        "    # Reset flag and start iterating until episode ends\n",
        "    done = False\n",
        "    while not done:\n",
        "\n",
        "        # print(\"current state\", current_state)\n",
        "        action = agent.choose_action(current_state)\n",
        "        next_state, reward, done, _ = env.step(action)\n",
        "\n",
        "        # Store [s a r]\n",
        "        episode_states.append(current_state)\n",
        "        episode_actions.append(action)\n",
        "        episode_rewards.append(reward)\n",
        "\n",
        "\n",
        "        # Transform new continous state to new discrete state and count reward\n",
        "        episode_reward += reward\n",
        "\n",
        "#         if not episode % AGGREGATE_STATS_EVERY:\n",
        "#             env.render()\n",
        "\n",
        "        current_state = next_state\n",
        "\n",
        "    agent.train(np.vstack(episode_states), np.array(episode_actions), np.array(episode_rewards))\n",
        "    \n",
        "    # vis.line([episode_reward],[episode],win='ep_rewards',update='append')\n",
        "    \n",
        "    # Append episode reward to a list and log rewards (every given number of episodes)\n",
        "    ep_rewards.append(episode_reward)\n",
        "\n",
        "    if not episode % AGGREGATE_STATS_EVERY or episode == 1:\n",
        "        average_reward = sum(ep_rewards[-AGGREGATE_STATS_EVERY:])/len(ep_rewards[-AGGREGATE_STATS_EVERY:])\n",
        "        min_reward = min(ep_rewards[-AGGREGATE_STATS_EVERY:])\n",
        "        max_reward = max(ep_rewards[-AGGREGATE_STATS_EVERY:])\n",
        "        \n",
        "        # vis.line([[average_reward,min_reward,max_reward]], [episode], win='aggr_ep_reward',\n",
        "        #          update='append',\n",
        "        #          opts=dict(title='aggr_ep_reward',legend=['avg','min','max']))\n",
        "\n",
        "        aggr_ep_rewards['ep'].append(episode)\n",
        "        aggr_ep_rewards['avg'].append(average_reward)\n",
        "        aggr_ep_rewards['min'].append(min_reward)\n",
        "        aggr_ep_rewards['max'].append(max_reward)\n",
        "        \n",
        "#         agent.tensorboard.update_stats(reward_avg=average_reward, reward_min=min_reward, reward_max=max_reward, epsilon=epsilon)\n"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "100%|##########| 30000/30000 [2:33:55<00:00,  3.25episodes/s]\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "QQ22Ry_q4mQS"
      },
      "source": [
        "## 5. Plot episodes vs rewards"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "V9ZHhcfSrr74",
        "colab_type": "code",
        "outputId": "70aa0a11-2d5b-4dda-9589-87110dbeb544",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 296
        }
      },
      "source": [
        "plt.plot(aggr_ep_rewards['ep'], aggr_ep_rewards['avg'], label = 'avg')\n",
        "plt.plot(aggr_ep_rewards['ep'], aggr_ep_rewards['min'], label = 'min')\n",
        "plt.plot(aggr_ep_rewards['ep'], aggr_ep_rewards['max'], label = 'max')\n",
        "plt.legend(loc='upper left')\n",
        "plt.xlabel('Episodes')\n",
        "plt.ylabel('Rewards')"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Text(0, 0.5, 'Rewards')"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 16
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "9ILbxFFfIckN"
      },
      "source": [
        "### Rendering Test"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "iFZ1eIgjHwXw",
        "colab": {}
      },
      "source": [
        "done = False\n",
        "state = env.reset()\n",
        "for i in range(500):\n",
        "# while not done:\n",
        "    action = agent.choose_action(state)\n",
        "    next_state, _, done, _ = env.step(action)\n",
        "    state = next_state\n",
        "    env.render()\n",
        "\n",
        "env.close()\n",
        "    "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "rGBxWL5Wrr8I",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "name": "Copy_of_1_policy_gradient_TF2_cartpole.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}